/* bombz.c */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "DeskLib:Error.h"
#include "DeskLib:MsgTrans.h"

#include "bombz.h"
#include "bsound.h"
#include "clock.h"
#include "gchars.h"
#include "graphics.h"
#include "key.h"
#include "man.h"
#include "map.h"
#include "scrn.h"

int bombz_level;

void bombz_initialise()
{
  graphics_load("<Bombz$Dir>.Resources.Graphics");
  map_init_table();
  bombz_level = 1;
  gchars_init("<Bombz$Dir>.Resources.Chars");
}

void bombz_title(scrn_type scrntype,msgtrans_filedesc *msgs)
{
  int time_limit;
  char title[40];
  char password[12];
  char msgbuf[128];

  /* Set up screen */
  scrn_save_desktop_mode();
  if (!scrn_setup(scrntype))
    return;

  scrn_cursor_off();

  if (!map_load_level("<Bombz$Dir>.Levels.",bombz_level,&time_limit,
      		      title,password))
  {
    scrn_cursor_on();
    scrn_restore_desktop_mode();
    sprintf(password,"%d",bombz_level);
    MsgTrans_ReportPS(msgs,"LevLd",FALSE,password,0,0,0);
    bombz_level = 1;
    return;
  }

  /* Main loop */
  do
  {
    /* Print title screen */
    bombz_show_title(msgs,bombz_level,title,password);
    /* Give player chance to release keys */
    while (!pressing_anything());
    while (!pressing_space() &&
      	   !pressing_f12() &&
      	   !pressing_esc() &&
      	   !pressing_l());
    if (pressing_space())
    {
      man_status result;
      scrn_start_banking();
      result = bombz_play_level(time_limit);
      scrn_cancel_banking();
      putchar(12);
      switch (result)
      {
        case status_COMPLETED:
          MsgTrans_Lookup(msgs,"WellDone",msgbuf,128);
          if (SoundChannels)
          {
            int dummy;
            xsound_stereo(1, 0, &dummy);
            xsound_attach_named_voice(1, "BombzVoc3");
            xsound_control(1, SoundVolume, GongPitch-0x1000, 100);
          }
          gchars_moveto(0,40);
          gchars_centre(msgbuf);
          bombz_level++;
          break;
        case status_ESC:
        case status_TIMEUP:
        case status_BLOWNUP:
          if (SoundChannels)
          {
            int dummy;
            xsound_stereo(1, 0, &dummy);
            xsound_attach_named_voice(1, "BombzVoc4");
            xsound_control(1, SoundVolume, OracPitch, 100);
          }
          MsgTrans_Lookup(msgs,
          	result==status_BLOWNUP ? "BlownUp" :
          		(result==status_TIMEUP ? "TimeUp" : "Esc"),
          	msgbuf,128);
          gchars_moveto(0,40);
          gchars_centre(msgbuf);
          break;
      }
      MsgTrans_Lookup(msgs,"Space",msgbuf,128);
      gchars_moveto(0,160);
      gchars_centre(msgbuf);
      while (!pressing_space());
      if (!map_load_level("<Bombz$Dir>.Levels.",bombz_level,&time_limit,
        		  title,password))
      {
        int delay;
        
        putchar(12);
        MsgTrans_Lookup(msgs,"TheEnd",msgbuf,128);
        gchars_moveto(0,100);
        gchars_centre(msgbuf);
        for (delay = 0; delay < 120; delay++)
          scrn_wait();
        scrn_cursor_on();
        scrn_restore_desktop_mode();
        bombz_level = 1;
        return;
      }
    }
    else if (pressing_l())
    {
      /* Password entry */
      int level;
      int i;

      putchar(12);

      MsgTrans_Lookup(msgs,"WLevel",msgbuf,128);
      gchars_moveto(0,40);
      gchars_writes(msgbuf);
      gchars_input(msgbuf,3,"0123456789");
      level = atoi(msgbuf);
      if (!map_load_level("<Bombz$Dir>.Levels.",level,&time_limit,
          		      title,password))
      {
        scrn_cursor_on();
        scrn_restore_desktop_mode();
        sprintf(password,"%d",level);
        MsgTrans_ReportPS(msgs,"LevLd",FALSE,password,0,0,0);
        return;
      }
      for (i = 1; i <= 2; i++)
      {
        MsgTrans_Lookup(msgs,"Pass",msgbuf,128);
        gchars_moveto(0,100);
        gchars_printf("%s ? ",msgbuf);
        gchars_input(msgbuf,8,"ABCDEFGHIJKLMNOPQRSTUVWXYZ");
        if (!strcmp(msgbuf,password))
          i = 100;
        else
        {
          int delay;

          MsgTrans_Lookup(msgs,"Wrong",msgbuf,128);
          gchars_moveto(0,100);
          gchars_writes("                    ");
          gchars_centre(msgbuf);
          for (delay = 0; delay < 100; delay++)
            scrn_wait();
          gchars_moveto(0,100);
          gchars_writes("                    ");
        }
      }
      if (i >= 100)
        bombz_level = level;
      else
      {
        scrn_cursor_on();
        scrn_restore_desktop_mode();
        return;
      }
    }
  }
  while (!pressing_f12() && !pressing_esc());
  scrn_cursor_on();
  scrn_restore_desktop_mode();
}

man_status bombz_play_level(int time_limit)
{
  man_status status;
  int subticks;

  /* Initialise clock */
  clock_init(time_limit);
  subticks = 0;

  /* Main loop */
  status = status_PLAYING;
  do
  {
    if (map_scan())
      status = status_BLOWNUP;
    if (!status)
      status = man_move();
    map_draw(scrn_offset);
    man_draw(scrn_offset);
    clock_start = (void *) ((int) scrn_address + clock_start_offset);
    if (++subticks == clock_SUBTICKS)
    {
      subticks = 0;
      if (clock_width)
        clock_width--;
    }
    (*scrn_clock_plotter)(scrn_rowsize);
    scrn_swap_banks();
    if (pressing_esc())
      status = status_ESC;
    if (status == status_COMPLETED && clock_width == 0)
      status = status_TIMEUP;
  } while (!status);

  return status;
}

void bombz_show_title(msgtrans_filedesc *msgs,int level,
     		      char *title,char *password)
{
  char msgbuffer[256];

  putchar(12); /* Clear screen */
  MsgTrans_Lookup(msgs,"Level",msgbuffer,256);
  gchars_moveto(0,20);
  gchars_centref("%s %d",msgbuffer,level);
  gchars_writes("\n\n");
  gchars_centre(title);
  gchars_moveto(0,120);
  MsgTrans_Lookup(msgs,"Pass",msgbuffer,256);
  gchars_centref("%s  %s",msgbuffer,password);
  gchars_writes("\n\n");
  MsgTrans_Lookup(msgs,"Play",msgbuffer,256);
  gchars_writes(msgbuffer);
  gchars_writec('\n');
  MsgTrans_Lookup(msgs,"CLevel",msgbuffer,256);
  gchars_writes(msgbuffer);
  gchars_writec('\n');
  MsgTrans_Lookup(msgs,"DeskF12",msgbuffer,256);
  gchars_writes(msgbuffer);
}
